import { observable, action } from 'mobx-miniprogram';
import setting from '../../config/projects.js';
import SystemHelper from '../../helpers/system_helper.js';
import { standardizeGlobalStore } from '../helpers/store_standardizer.js';

// 缓存键
const SYSTEM_INFO_KEY = 'APP_SYSTEM_INFO';
const USER_CONFIG_KEY = 'APP_USER_CONFIG';
const SYS_CONFIG_KEY = 'APP_SYS_CONFIG';

// 系统配置默认值
const DEFAULT_SYS_CONFIG = {
  version: setting.PROJECT_VER || '1.0.0',
  debug: false,
  serverTimeout: 30000,
  cacheExpireTime: 1800, // 默认缓存30分钟
  imageQuality: 'high',
  theme: 'default',
  uploadImageSize: 1024 * 1024 * 5, // 5MB
  maxListSize: 200,
  notificationEnabled: true
};

// 创建应用配置Store
export const appStore = observable({
  // 云环境ID
  cloudEnv: setting.CLOUD_ID || 'cloud1-5gffmfzj82d38ce5',
  
  // 系统信息
  systemInfo: null,
  
  // 胶囊按钮信息（自定义导航用）
  menuButtonInfo: null,
  
  // 自定义导航相关
  customNavHeight: 0,
  statusBarHeight: 20,
  
  // 应用基本信息
  appInfo: {
    name: setting.PROJECT_TITLE || '办公系统',
    version: setting.PROJECT_VER || '1.0.0',
    logo: setting.PROJECT_LOGO || '',
    description: setting.PROJECT_DESC || '',
    copyright: setting.PROJECT_COPYRIGHT || '',
    company: setting.PROJECT_COMPANY || ''
  },
  
  // 系统配置 - 从服务器或缓存加载
  systemConfig: { ...DEFAULT_SYS_CONFIG },
  
  // 用户配置 - 用户个性化设置
  userConfig: {
    notificationEnabled: true,
    darkMode: false,
    fontSize: 'normal',
    language: 'zh_CN',
    lastNavigationPath: '',
    favoriteFunctions: []
  },
  
  // 环境标志
  isDevEnv: __wxConfig && __wxConfig.envVersion === 'develop',
  
  // 当前选中的项目ID
  currentProjectId: '',
  
  // 初始化
  init: action(function() {
    // 初始化系统信息
    this._initSystemInfo();
    
    // 加载用户配置
    this._loadUserConfig();
    
    // 加载系统配置
    this._loadSystemConfig();
  }),
  
  // 初始化系统信息
  _initSystemInfo: action(function() {
    try {
      // 尝试从缓存获取系统信息
      const cachedSystemInfo = wx.getStorageSync(SYSTEM_INFO_KEY);
      if (cachedSystemInfo) {
        this.systemInfo = cachedSystemInfo;
        this.statusBarHeight = cachedSystemInfo.statusBarHeight || 20;
      } else {
        this._refreshSystemInfo();
      }
    } catch (e) {
      console.error('获取系统信息缓存失败:', e);
      this._refreshSystemInfo();
    }
  }),
  
  // 刷新系统信息
  _refreshSystemInfo: action(function() {
    try {
      // 使用 SystemHelper 获取系统信息
      SystemHelper.getSystemInfoAsync(true).then(systemInfo => {
        // 更新状态
        this.systemInfo = systemInfo;
        this.statusBarHeight = systemInfo.statusBarHeight || 20;
        
        // 获取胶囊按钮信息
        const menuButtonInfo = wx.getMenuButtonBoundingClientRect();
        this.menuButtonInfo = menuButtonInfo;
        
        // 计算自定义导航高度
        if (menuButtonInfo) {
          this.customNavHeight = menuButtonInfo.bottom + menuButtonInfo.top - systemInfo.statusBarHeight;
        } else {
          this.customNavHeight = 44; // 默认导航高度
        }
        
        // 缓存系统信息
        wx.setStorageSync(SYSTEM_INFO_KEY, systemInfo);
      }).catch(error => {
        console.error('获取系统信息失败:', error);
        // 设置默认值
        this.statusBarHeight = 20;
        this.customNavHeight = 44;
      });
    } catch (error) {
      console.error('系统信息处理异常:', error);
      // 设置默认值
      this.statusBarHeight = 20;
      this.customNavHeight = 44;
    }
  }),
  
  // 加载用户配置
  _loadUserConfig: action(function() {
    try {
      const cachedUserConfig = wx.getStorageSync(USER_CONFIG_KEY);
      if (cachedUserConfig) {
        // 合并默认配置和缓存配置
        this.userConfig = { ...this.userConfig, ...cachedUserConfig };
      }
    } catch (e) {
      console.error('加载用户配置失败:', e);
    }
  }),
  
  // 加载系统配置
  _loadSystemConfig: action(function() {
    try {
      // 先从缓存加载
      const cachedSysConfig = wx.getStorageSync(SYS_CONFIG_KEY);
      if (cachedSysConfig) {
        this.systemConfig = { ...DEFAULT_SYS_CONFIG, ...cachedSysConfig };
      }
      
      // 再从服务器获取最新配置
      this._fetchSystemConfigFromServer();
    } catch (e) {
      console.error('加载系统配置失败:', e);
    }
  }),
  
  // 从服务器获取系统配置
  _fetchSystemConfigFromServer: action(function() {
    // 这里实现从服务器获取最新配置的逻辑
    // 例如调用云函数获取系统配置
    wx.cloud.callFunction({
      name: 'config',
      data: { action: 'getSystemConfig' }
    }).then(res => {
      if (res.result && res.result.data) {
        // 更新系统配置
        this.setSystemConfig(res.result.data);
      }
    }).catch(err => {
      console.error('获取系统配置失败:', err);
      // 错误时仍使用缓存或默认配置
    });
  }),
  
  // 设置系统信息
  setSystemInfo: action(function(info) {
    this.systemInfo = info;
    this.statusBarHeight = info.statusBarHeight || 20;
    
    // 缓存系统信息
    try {
      wx.setStorageSync(SYSTEM_INFO_KEY, info);
    } catch (e) {
      console.error('缓存系统信息失败:', e);
    }
  }),
  
  // 设置胶囊按钮信息
  setMenuButtonInfo: action(function(info) {
    this.menuButtonInfo = info;
    
    if (info && this.systemInfo) {
      this.customNavHeight = info.bottom + info.top - this.systemInfo.statusBarHeight;
    } else {
      this.customNavHeight = 44; // 默认导航高度
    }
  }),
  
  // 设置用户配置
  setUserConfig: action(function(config) {
    // 合并现有配置
    this.userConfig = { ...this.userConfig, ...config };
    
    // 保存到缓存
    try {
      wx.setStorageSync(USER_CONFIG_KEY, this.userConfig);
    } catch (e) {
      console.error('保存用户配置失败:', e);
    }
  }),
  
  // 设置系统配置
  setSystemConfig: action(function(config) {
    // 合并现有配置
    this.systemConfig = { ...this.systemConfig, ...config };
    
    // 保存到缓存
    try {
      wx.setStorageSync(SYS_CONFIG_KEY, this.systemConfig);
    } catch (e) {
      console.error('保存系统配置失败:', e);
    }
  }),
  
  // 更新单个用户配置
  updateUserSetting: action(function(key, value) {
    if (this.userConfig.hasOwnProperty(key) && value !== undefined) {
      this.userConfig[key] = value;
      
      // 保存到缓存
      try {
        wx.setStorageSync(USER_CONFIG_KEY, this.userConfig);
      } catch (e) {
        console.error('保存用户配置失败:', e);
      }
    }
  }),
  
  // 获取系统配置值
  getConfigValue: function(key, defaultValue) {
    if (this.systemConfig.hasOwnProperty(key)) {
      return this.systemConfig[key];
    }
    return defaultValue;
  },
  
  // 获取用户配置值
  getUserConfigValue: function(key, defaultValue) {
    if (this.userConfig.hasOwnProperty(key)) {
      return this.userConfig[key];
    }
    return defaultValue;
  },
  
  // 记录最后访问路径
  recordLastPath: action(function(path) {
    if (!path) return;
    
    this.updateUserSetting('lastNavigationPath', path);
  }),
  
  // 添加收藏功能
  addFavoriteFunction: action(function(funcId) {
    if (!funcId || this.userConfig.favoriteFunctions.includes(funcId)) return;
    
    const newFavorites = [...this.userConfig.favoriteFunctions, funcId];
    this.updateUserSetting('favoriteFunctions', newFavorites);
  }),
  
  // 移除收藏功能
  removeFavoriteFunction: action(function(funcId) {
    if (!funcId) return;
    
    const newFavorites = this.userConfig.favoriteFunctions.filter(id => id !== funcId);
    this.updateUserSetting('favoriteFunctions', newFavorites);
  }),
  
  // 设置当前项目ID
  setCurrentProjectId: action(function(projectId) {
    this.currentProjectId = projectId;
  }),
  
  // 判断是否iOS设备
  get isIOS() {
    return this.systemInfo && this.systemInfo.platform === 'ios';
  },
  
  // 判断是否安卓设备
  get isAndroid() {
    return this.systemInfo && this.systemInfo.platform === 'android';
  },
  
  // 判断是否开发环境
  get isDev() {
    return this.isDevEnv;
  },
  
  // 判断是否调试模式
  get isDebug() {
    return this.systemConfig.debug || this.isDevEnv;
  },
  
  // 获取安全区域
  get safeArea() {
    return this.systemInfo ? (this.systemInfo.safeArea || {}) : {};
  },
  
  // 获取屏幕宽度
  get screenWidth() {
    return this.systemInfo ? this.systemInfo.screenWidth : 375;
  },
  
  // 获取屏幕高度
  get screenHeight() {
    return this.systemInfo ? this.systemInfo.screenHeight : 667;
  },
  
  // 获取窗口宽度
  get windowWidth() {
    return this.systemInfo ? this.systemInfo.windowWidth : 375;
  },
  
  // 获取窗口高度
  get windowHeight() {
    return this.systemInfo ? this.systemInfo.windowHeight : 667;
  },
  
  // 获取设备像素比
  get pixelRatio() {
    return this.systemInfo ? this.systemInfo.pixelRatio : 2;
  },
  
  // 获取当前主题
  get theme() {
    return this.userConfig.darkMode ? 'dark' : 'light';
  },
  
  // 是否深色模式
  get isDarkMode() {
    return this.userConfig.darkMode;
  }
});

// 应用标准化Store，确保拥有所有必要的方法和错误处理
export default standardizeGlobalStore(appStore, 'app'); 